/**
 * 
 */
package cl.duocap.refaxion.view.bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import cl.duocap.refaxion.arquitectura.Jsf2Util;
import cl.duocap.refaxion.dto.PaqueteDTO;
import cl.duocap.refaxion.dto.RepuestoDTO;
import cl.duocap.refaxion.dto.ServicioDTO;
import cl.duocap.refaxion.servicios.PaqueteService;
import cl.duocap.refaxion.servicios.RepuestoService;
import cl.duocap.refaxion.servicios.ServicioService;

/**
 * @author rentonx
 *
 */
@ManagedBean (name="formPaqueteMantencionEditarBean")
@SessionScoped
public class FormPaqueteMantencionEditarBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private PaqueteDTO paqueteEditar;
	private int idPaqueteEditar;
	private boolean desabilitado = false;
	
	private List<ServicioDTO> listadoServiciosObtenidos;
	private Map<String, Integer> listadoServicios;
	private List<String> listaServiciosSel;
	private List<ServicioDTO> listaServiciosSelEnGrilla = new ArrayList<ServicioDTO>();
	
	
	private int serviciosSumaTotalPrecio = 0;
	private int servicioPrecio = 0;
	
	private List<RepuestoDTO> listadoRepuestosObtenidos;
	private Map<String, Integer> listadoRepuestos;
	private List<String> listaRepuestosSel;
	private List<RepuestoDTO> listaRepuestosSelEnGrilla = new ArrayList<RepuestoDTO>();
	
	
	private int repuestosSumaTotalPrecio = 0;
	private int repuestoPrecio = 0;
	
	
	private int repuestoPorQuitar;
	private int servicioPorQuitar;
	
	private int precioPaqueteTotalCalculado=0;
	private int precioPaqueteTotalFinal=0;
	private int descuentoAplicado = 0;
	private int idMaximoPaqueteNuevo;
	
	@ManagedProperty("#{jsf2Util}")
	private Jsf2Util jsf2Util;
	/**
	 * 
	 */
	@PostConstruct
	public void iniciar(){
		if(FacesContext.getCurrentInstance().isPostback()){
			return;
		}
		paqueteEditar = new PaqueteDTO();
		
		RepuestoService respuesto = new RepuestoService();
		setListadoRepuestosObtenidos(respuesto.obtenerTodosRepuestos());
		listadoRepuestos = new LinkedHashMap<String, Integer>();
		for (RepuestoDTO r: listadoRepuestosObtenidos) {
			listadoRepuestos.put(r.getDescripcion(),r.getIdRepuesto());
		}
		
		ServicioService servicio = new ServicioService();
		setListadoServiciosObtenidos(servicio.obtenerServicios());
		listadoServicios = new LinkedHashMap<String, Integer>();
		for (ServicioDTO s : listadoServiciosObtenidos) {
			listadoServicios.put(s.getServicioDescripcion(), s.getIdServicio());
		}
		cargarPaqueteEditar();
		
		
	}
	
	public void cargarPaqueteEditar(){
		idPaqueteEditar = Integer.parseInt(jsf2Util.getParameter("idPaquete"));
		
		PaqueteService paqueteEditarHallado = new PaqueteService();
		setPaqueteEditar(paqueteEditarHallado.traerPaqueteEditar(idPaqueteEditar));
		setPrecioPaqueteTotalCalculado(paqueteEditar.getPrecioNeto());
		setDescuentoAplicado(paqueteEditar.getDescuento());
		setPrecioPaqueteTotalFinal(paqueteEditar.getPrecioTotal());
		
		//cargar servicios de paq de mantencion
		PaqueteService paqueteEditarServicios = new PaqueteService();
		setListaServiciosSelEnGrilla(paqueteEditarServicios.traeServiciosrPaqueteEditar(idPaqueteEditar));
		serviciosSumaTotalPrecio = 0;
		for (ServicioDTO s : listaServiciosSelEnGrilla){
			serviciosSumaTotalPrecio = serviciosSumaTotalPrecio + s.getPrecioListaServicio();
		}
		
		//cargar repuestos de paq de mantencion
		PaqueteService paqueteEditarRepuestos = new PaqueteService();
		setListaRepuestosSelEnGrilla(paqueteEditarRepuestos.traeRepuestosrPaqueteEditar(idPaqueteEditar));
		repuestosSumaTotalPrecio = 0;
		for (RepuestoDTO r : listaRepuestosSelEnGrilla){
			repuestosSumaTotalPrecio = repuestosSumaTotalPrecio + r.getPrecioRepuesto();
		}
		
		//precioPaqueteTotalCalculado = serviciosSumaTotalPrecio + repuestosSumaTotalPrecio;
		

		
	}
	
	public void listenerQuitarServicio(ServicioDTO servicioQuitarSeleccion){

		setServicioPorQuitar(servicioQuitarSeleccion.getIdServicio());
		setServicioPrecio(servicioQuitarSeleccion.getPrecioListaServicio());
		
	}
	
	public void confirmarQuitarServicioGrilla(){	
		setServiciosSumaTotalPrecio(serviciosSumaTotalPrecio - getServicioPrecio());
		setPrecioPaqueteTotalCalculado(precioPaqueteTotalCalculado - getServicioPrecio());
		for (ServicioDTO s : listaServiciosSelEnGrilla) {
			if(s.getIdServicio() == servicioPorQuitar){
				listaServiciosSelEnGrilla.remove(s);
			}
		}
		precioPaqueteTotalFinal = precioPaqueteTotalCalculado;
	}
	
	public void listenerQuitarRepuesto(RepuestoDTO repuestoQuitarSeleccion){

		setRepuestoPorQuitar(repuestoQuitarSeleccion.getIdRepuesto());
		setRepuestoPrecio(repuestoQuitarSeleccion.getPrecioRepuesto());
		
	}
	
	public void confirmarQuitarRepuestoGrilla(){	
		setRepuestosSumaTotalPrecio(repuestosSumaTotalPrecio - getRepuestoPrecio());
		setPrecioPaqueteTotalCalculado(precioPaqueteTotalCalculado - getRepuestoPrecio());
		for (RepuestoDTO r : listaRepuestosSelEnGrilla) {
			if(r.getIdRepuesto() == repuestoPorQuitar){
				listaRepuestosSelEnGrilla.remove(r);
			}
		}
		precioPaqueteTotalFinal = precioPaqueteTotalCalculado;
	}
	
	public void aplicarDescuento(){
		precioPaqueteTotalFinal= precioPaqueteTotalCalculado - descuentoAplicado;
	}
	
	public void agregarServicio(){
		
		if(listaServiciosSel.size()>0){
			for (String serAux : listaServiciosSel) {
				ServicioService servicio = new ServicioService();
				listaServiciosSelEnGrilla.add(servicio.traerServicioEditar(Integer.parseInt(serAux)));
				
			}
			precioPaqueteTotalCalculado = precioPaqueteTotalCalculado - serviciosSumaTotalPrecio;
			serviciosSumaTotalPrecio = 0;
			for (ServicioDTO sr : listaServiciosSelEnGrilla) {
				serviciosSumaTotalPrecio = serviciosSumaTotalPrecio + sr.getPrecioListaServicio();
				precioPaqueteTotalCalculado= precioPaqueteTotalCalculado + sr.getPrecioListaServicio();
			}
			listaServiciosSel = Collections.emptyList();
			precioPaqueteTotalFinal = precioPaqueteTotalCalculado;
			
		}
	}
	
	public void agregarRepuesto(){
		
		if(listaRepuestosSel.size()>0){
			for (String repAux : listaRepuestosSel) {
				RepuestoService repuesto = new RepuestoService();
				listaRepuestosSelEnGrilla.add(repuesto.cargarRepuestoEditar(Integer.parseInt(repAux)));
				
			}
			precioPaqueteTotalCalculado = precioPaqueteTotalCalculado - repuestosSumaTotalPrecio;
			repuestosSumaTotalPrecio = 0;
			for (RepuestoDTO r : listaRepuestosSelEnGrilla) {
				repuestosSumaTotalPrecio = repuestosSumaTotalPrecio + r.getPrecioRepuesto();
				precioPaqueteTotalCalculado = precioPaqueteTotalCalculado + r.getPrecioRepuesto();
			}
			//listaRepuestosSel = Collections.emptyList();
			listaRepuestosSel = null;
			precioPaqueteTotalFinal = precioPaqueteTotalCalculado;
			
		}
		
	 }
	
	public void limpiarDatosRepuesto(){
		this.listaRepuestosSel = Collections.emptyList();
	}
	
	public void limpiarDatosServicio(){
		this.listaServiciosSel = Collections.emptyList();
	}
	
	public void ResumarGrillaServicio(){
		
	}
	
	
	public FormPaqueteMantencionEditarBean () {
	
	}


	public PaqueteDTO getPaqueteEditar() {
		return paqueteEditar;
	}


	public void setPaqueteEditar(PaqueteDTO paqueteEditar) {
		this.paqueteEditar = paqueteEditar;
	}


	public boolean isDesabilitado() {
		return desabilitado;
	}


	public void setDesabilitado(boolean desabilitado) {
		this.desabilitado = desabilitado;
	}


	public List<String> getListaServiciosSel() {
		return listaServiciosSel;
	}


	public void setListaServiciosSel(List<String> listaServiciosSel) {
		this.listaServiciosSel = listaServiciosSel;
	}


	public List<ServicioDTO> getListaServiciosSelEnGrilla() {
		return listaServiciosSelEnGrilla;
	}


	public void setListaServiciosSelEnGrilla(
			List<ServicioDTO> listaServiciosSelEnGrilla) {
		this.listaServiciosSelEnGrilla = listaServiciosSelEnGrilla;
	}


	public List<ServicioDTO> getListadoServiciosObtenidos() {
		return listadoServiciosObtenidos;
	}


	public void setListadoServiciosObtenidos(
			List<ServicioDTO> listadoServiciosObtenidos) {
		this.listadoServiciosObtenidos = listadoServiciosObtenidos;
	}


	public Map<String, Integer> getListadoServicios() {
		return listadoServicios;
	}


	public void setListadoServicios(Map<String, Integer> listadoServicios) {
		this.listadoServicios = listadoServicios;
	}


	public int getServiciosSumaTotalPrecio() {
		return serviciosSumaTotalPrecio;
	}


	public void setServiciosSumaTotalPrecio(int serviciosSumaTotalPrecio) {
		this.serviciosSumaTotalPrecio = serviciosSumaTotalPrecio;
	}


	public int getServicioPrecio() {
		return servicioPrecio;
	}


	public void setServicioPrecio(int servicioPrecio) {
		this.servicioPrecio = servicioPrecio;
	}


	public List<String> getListaRepuestosSel() {
		return listaRepuestosSel;
	}


	public void setListaRepuestosSel(List<String> listaRepuestosSel) {
		this.listaRepuestosSel = listaRepuestosSel;
	}



	public List<RepuestoDTO> getListaRepuestosSelEnGrilla() {
		return listaRepuestosSelEnGrilla;
	}


	public void setListaRepuestosSelEnGrilla(
			List<RepuestoDTO> listaRepuestosSelEnGrilla) {
		this.listaRepuestosSelEnGrilla = listaRepuestosSelEnGrilla;
	}


	public List<RepuestoDTO> getListadoRepuestosObtenidos() {
		return listadoRepuestosObtenidos;
	}


	public void setListadoRepuestosObtenidos(
			List<RepuestoDTO> listadoRepuestosObtenidos) {
		this.listadoRepuestosObtenidos = listadoRepuestosObtenidos;
	}


	public Map<String, Integer> getListadoRepuestos() {
		return listadoRepuestos;
	}


	public void setListadoRepuestos(Map<String, Integer> listadoRepuestos) {
		this.listadoRepuestos = listadoRepuestos;
	}


	public int getRepuestosSumaTotalPrecio() {
		return repuestosSumaTotalPrecio;
	}


	public void setRepuestosSumaTotalPrecio(int repuestosSumaTotalPrecio) {
		this.repuestosSumaTotalPrecio = repuestosSumaTotalPrecio;
	}


	public int getRepuestoPrecio() {
		return repuestoPrecio;
	}


	public void setRepuestoPrecio(int repuestoPrecio) {
		this.repuestoPrecio = repuestoPrecio;
	}


	public int getRepuestoPorQuitar() {
		return repuestoPorQuitar;
	}


	public void setRepuestoPorQuitar(int repuestoPorQuitar) {
		this.repuestoPorQuitar = repuestoPorQuitar;
	}


	public int getServicioPorQuitar() {
		return servicioPorQuitar;
	}


	public void setServicioPorQuitar(int servicioPorQuitar) {
		this.servicioPorQuitar = servicioPorQuitar;
	}


	public int getPrecioPaqueteTotalCalculado() {
		return precioPaqueteTotalCalculado;
	}


	public void setPrecioPaqueteTotalCalculado(int precioPaqueteTotalCalculado) {
		this.precioPaqueteTotalCalculado = precioPaqueteTotalCalculado;
	}


	public int getPrecioPaqueteTotalFinal() {
		return precioPaqueteTotalFinal;
	}


	public void setPrecioPaqueteTotalFinal(int precioPaqueteTotalFinal) {
		this.precioPaqueteTotalFinal = precioPaqueteTotalFinal;
	}


	public int getDescuentoAplicado() {
		return descuentoAplicado;
	}


	public void setDescuentoAplicado(int descuentoAplicado) {
		this.descuentoAplicado = descuentoAplicado;
	}


	public int getIdMaximoPaqueteNuevo() {
		return idMaximoPaqueteNuevo;
	}


	public void setIdMaximoPaqueteNuevo(int idMaximoPaqueteNuevo) {
		this.idMaximoPaqueteNuevo = idMaximoPaqueteNuevo;
	}


	public Jsf2Util getJsf2Util() {
		return jsf2Util;
	}


	public void setJsf2Util(Jsf2Util jsf2Util) {
		this.jsf2Util = jsf2Util;
	}

	public int getIdPaqueteEditar() {
		return idPaqueteEditar;
	}

	public void setIdPaqueteEditar(int idPaqueteEditar) {
		this.idPaqueteEditar = idPaqueteEditar;
	}
	
	

}
